package cn.com.yang.thread;

import java.util.Map;
import java.util.Set;

/**
 * 获取应用的线程数
 * TODO
 * @author yangyijin
 * @since 2024年6月19日-下午2:50:25
 */
public class GetAPPThreads {
	
	public static void main(String[] args) {
		Map<Thread,StackTraceElement[]> allThreads = Thread.getAllStackTraces();
		Set<Thread> threadSet = allThreads.keySet();
		//打印应用所有线程数量
		System.out.println("当前数量："+threadSet.size());
		for(Thread t1: threadSet) {
			System.out.println(">>当前线程："+t1.getId()+"名字："+t1.getName()+"优先级："+t1.getPriority());
		}
		/**
		 *  当前数量：5
			>>当前线程：3名字：Finalizer优先级：8
				)Finalizer线程是JVM中的一个守护线程（daemon thread），用于在对象被垃圾回收之前执行其finalize()方法。
				当一个对象不再被引用，并且垃圾回收器确定该对象即将被回收时，JVM会将该对象加入到一个称为"F-Queue"的队列中。
				Finalizer线程会不断地从"F-Queue"队列中取出对象，并调用其finalize()方法进行清理操作，如释放资源、关闭连接等。
				)Finalizer线程在Java虚拟机（JVM）中负责执行对象的finalize()方法，这是对象在垃圾回收前进行清理操作的一个重要机制
			>>当前线程：5名字：Attach Listener优先级：5
				)职责：
				Attach Listener线程是负责接收外部的命令或请求的线程。
				这些外部命令或请求通常来自于JVM工具，如jps、jstack、jmap等，用于获取JVM的状态信息、线程堆栈跟踪、内存映射等。
				工作流程：
				当Attach Listener线程接收到外部命令时，它会执行该命令并将结果返回给发送者。
				如果JVM在启动时Attach Listener线程尚未初始化，那么它会在用户第一次执行JVM命令时得到启动。
				与Signal Dispatcher线程的协作：
				Attach Listener线程在接收到外部JVM命令后，会将这些命令交给Signal Dispatcher线程去分发到各个不同的模块处理，并返回处理结果。
				这种协作机制使得JVM能够灵活响应并处理各种外部请求。
				初始化：
				Attach Listener线程可能在JVM启动时就已经初始化，或者在用户第一次执行JVM命令时得到启动。
				重要性：
				Attach Listener线程的存在使得JVM能够接收并响应来自外部JVM工具的命令和请求，这对于JVM的监控、调试和管理至关重要。
				通过Attach Listener线程，开发者可以获取JVM的内部状态信息，从而进行性能调优、故障排查等任务。
			>>当前线程：4名字：Signal Dispatcher优先级：9  
				)（JVM）中扮演着重要的角色，主要负责处理与信号相关的任务
				<br>
				信号接收与分发：
				Signal Dispatcher线程负责接收外部JVM命令或信号。
				当成功接收外部命令后，Signal Dispatcher线程会将这些命令分发到JVM内部的不同模块进行处理，并返回处理结果。
				初始化：
				Signal Dispatcher线程通常在第一次接收外部JVM命令时进行初始化。
				与Attach Listener线程的协作：
				Attach Listener线程是负责接收外部命令的线程，如java -version、jmap、jstack等。
				当Attach Listener线程成功接收外部命令后，它会将命令交给Signal Dispatcher线程进行分发和处理。
				这种协作机制类似于单一职责原则，并且引入了命令模式的概念，使得Attach Listener线程专注于接收命令，而Signal Dispatcher线程专注于命令的分发和处理。
				信号处理：
				Signal Dispatcher线程通过循环监听信号源（例如，操作系统的信号），当信号到达时，根据信号类型进行相应的处理。
				重要性：
				Signal Dispatcher线程的存在使得JVM能够灵活地响应外部命令和信号，从而支持多种JVM工具（如jmap、jstack）的运行和调试功能。
				线程优先级：
				根据某些JVM实现的源代码，Signal Dispatcher线程的优先级可能会被设置为接近最高优先级（NearMaxPriority），以确保它能够及时响应和处理信号。
				线程命名：
				Signal Dispatcher线程的具体名称可能会因JVM实现的不同而有所差异，但通常都包含“Signal Dispatcher”或类似的字样。
			>>当前线程：2名字：Reference Handler优先级：10  
				)JVM内部的一个守护线程（daemon thread）
				)这个线程的主要职责是负责处理Java对象的引用（特别是弱引用、软引用和虚引用）的清理工作(四种引用)。
				
			当前线程量：1名字：main优先级：5
		 */
		int count = Thread.activeCount();
		System.out.print("当前线程组,活跃线程数量："+count);
		/**
		 * 当前线程组，跃线程数量：1
		 */
	}
}
